package com.eds.manager;

import com.eds.log.LogUtil;
import org.slf4j.Logger;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created with IntelliJ IDEA.
 *
 * @ClassName：RecommendationTaskManager
 * @Author: vvSmile
 * @Date: 2025/04/09
 * @Description: 基于 Spring 的任务管理器 RecommendationTaskManager，用于管理推荐任务的执行和生命周期。
 * 通过线程池来异步处理任务，并在应用关闭时优雅地等待任务完成。
 */
@Component
public class RecommendationTaskManager implements DisposableBean {
    // 日志记录
    private static final Logger logger = LogUtil.getLogger(RecommendationTaskManager.class);
    // 当前正在处理的任务计数
    private final AtomicInteger activeTaskCount = new AtomicInteger(0);
    // 推荐任务线程池
    @Resource
    private ThreadPoolTaskExecutor recommendationTaskExecutor;

    // 提交任务到线程池
    public void submitTask(Runnable task) {
        //将任务计数加1
        activeTaskCount.incrementAndGet();
        // 执行任务
        recommendationTaskExecutor.execute(() -> {
            try {
                task.run();
            } finally {
                // 任务执行完毕后，将计数减1
                activeTaskCount.decrementAndGet();
            }
        });
    }

    /* *
     * @Title: destroy
     * @Author: vvSmile
     * @Date: 2025-04-09 16:50:43
     * @Description:  Spring 容器关闭时，等待所有任务完成
     */
    @Override
    public void destroy() throws Exception {
        logger.info("正在等待所有推荐任务完成..");
        // 不再接受新任务，但继续处理队列中的任务
        recommendationTaskExecutor.shutdown();
        // 等待所有任务完成，最多等待30秒
        try {
            int waitTime = 0;
            // 循环等待，最多等待30秒
            while (activeTaskCount.get() > 0 && waitTime < 30) {
                // 输出当前正在处理的任务数
                logger.info("正在等待所有推荐任务完成..当前正在处理的任务数: " + activeTaskCount.get());                // 休眠1秒
                Thread.sleep(1000);
                // 等待时间加1秒
                waitTime++;
            }
            //如果还有任务未完成，发出警告
            if (activeTaskCount.get() > 0) {
                logger.warn("应用关闭超时，仍有{" + activeTaskCount.get() + "}个推荐任务未完成!");
            } else {
                logger.info("所有推荐任务已完成!");
            }
        } catch (InterruptedException e) {
            // 如果发生中断，则重新设置中断标志
            Thread.currentThread().interrupt();
            logger.error("应用关闭时发生错误: " + e.getMessage());
        }
    }
}
